// ==UserScript==
// @name         小说 - 脚本 - 自动叠加下一章节
// @namespace    http://tampermonkey.net/
// @version      2025-02-22
// @description  发现一个更好用的插件脚本，叫《东方永页机》，自己写的这个就可以寿终正寝了。
// @description  ============ 运行时期：start / body  ，要不然可能不会在 window.onload 后执行
// @author       You
// @match        http://*/*
// @match        https://*/*
// @icon         http://wuweijun.fun/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  var qidong = [/小说|文学|笔趣阁|顶点|章节|漫画/, /第.{1,8}章/, /第.{1,8}节/], falg = true;
  for (let i = 0; i < qidong.length; i++) { if (qidong[i].test(document.title)) { falg = false; break; } }
  if (falg) return;

  let creatdiv;

  // 添加iframe标签
  function addiframe(url = '') {
    let sj = sjzf();
    var iframe = document.createElement("iframe");
    // iframe.src = url + "?iframeid=" + sj;
    iframe.src = url;
    iframe.id = sj;
    iframe.width = '100%';
    iframe.height = '2000';
    creatdiv.appendChild(iframe);
  }

  // 将url格式化为json
  function getSearchToJson(url) {
    var obj = {}
    var urlAll = url ? url : decodeURIComponent(location.href);
    var urlArr = urlAll.split("?")
    obj['url_'] = urlArr[0];
    if (urlArr.length !== 2)
      return obj;
    var searchArr = urlArr[1].split("&");
    for (let index = 0; index < searchArr.length; index++) {
      var s_ = searchArr[index].split("=");
      obj[s_[0]] = s_[1]
    }
    return obj;
  }

  // 要删除所有存储在 localStorage 中的数据
  function clearLocalStorage() {
    // 遍历 localStorage 的所有键
    for (let i = localStorage.length - 1; i >= 0; i--) {
      const key = localStorage.key(i);
      // 删除每个键对应的数据
      key != 'iframeidhref' && localStorage.removeItem(key);
    }
  }
  // 要删除所有存储在 Cookies 中的数据
  function clearCookies() {
    // 获取所有的 cookie
    const cookies = document.cookie.split(";");
    // 遍历每个 cookie
    for (let i = 0; i < cookies.length; i++) {
      const cookie = cookies[i];
      const eqPos = cookie.indexOf("=");
      const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
      // 设置每个 cookie 的过期时间为过去的时间以删除它
      document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
    }
  }


  // 获取随机字符串
  function sjzf() {
    return 'if' + Math.floor(Math.random() * 16777215).toString(16);
  }

  // ------------------------节流---------------------------
  function reduce(fn, wait = 500) {
    let on = true
    return function () {
      if (!on)
        return false
      on = false
      fn.apply(this, arguments)
      setTimeout(() => {
        on = true
      }
        , wait)
    }
  }

  // 获取 ‘下一章’ 之类的链接并保存到localStorage
  let isHasNext = false;
  function getNext() {
    let aTip = {};
    document.querySelectorAll('a').forEach((item) => {
      let text = item.innerText.trim();
      aTip[text] = item;
    })
    let aTipArr = Object.keys(aTip);
    let target = ['下一页', '下一章', '下一话', '下一篇'];
    for (let index = 0; index < target.length; index++) {
      const element = target[index];
      let t = aTipArr.find((item2) => item2.includes(element));
      if (t) {
        isHasNext = true;
        localStorage.setItem('iframeidhref', aTip[t].href)
        break;
      }
    }
  }

  // ===============================
  // ===============================
  // ===============================

  // 监听子iframe标签发送的信息
  window.addEventListener('message', function (event) {
    // 确保消息来自同源页面
    if (event.origin !== window.location.origin)
      return;

    // 接收来自iframe的消息并调整高度
    if (event.data && event.data.type === 'resize') {
      var iframe = document.querySelector(`iframe[src="${event.data.src}"]`)
      // var iframe = document.getElementById(event.data.id);
      iframe.style.height = event.data.height + 'px';
      setTimeout(() => {
        var parentElement = document.getElementById('mydiv');
        if (parentElement.childNodes.length > 5) parentElement.removeChild(parentElement.childNodes[0]);
      }, 1000);
    }
    // 修改状态栏地址
    if (event.data && event.data.type === 'url') {
      history.replaceState(null, '', event.data.url);
      document.title = event.data.title;
    }
  });

  // 子iframe标签向父标签发送信息
  function adjustIframeHeight() {
    // 计算iframe内容的高度
    var bodyHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
    let iframeid = getSearchToJson()?.iframeid || '';

    // 发送消息给父页面，请求调整iframe高度
    window.parent.postMessage({
      type: 'resize',
      id: iframeid || "",
      src: location.href,
      height: Number(bodyHeight) + 20
    }, new URL(location.href).origin);
    // 在开发环境中使用'*'，但在生产环境中应替换为具体的父页面源
  }
  // 在页面加载完成后调整iframe高度
  // window.onload = adjustIframeHeight;

  // 监听body是否在可视区,并修补状态栏地址
  function jiantingshezhiurl() {
    const target = document.body;
    const options = {
      root: null, // null means viewport is the root
      rootMargin: '0px',
      threshold: 0.1 // Element is considered in the viewport if 10% or more is visible
    };
    const callback = (entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) { // Element is in the viewport
          let url = location.href;
          // 发送消息给父页面，
          window.parent.postMessage({
            type: 'url',
            url: url.split('?')[0],
            src: location.href,
            title: document.title
          }, new URL(location.href).origin);
          // observer.disconnect();
        }
      });
    };
    const observer = new IntersectionObserver(callback);
    observer.observe(target);
  }

  function run22() {
    getNext();
    if (window == window.top) {
      // if (!getSearchToJson()?.iframeid) {
      creatdiv = document.createElement("div");
      creatdiv.id = 'mydiv';
      creatdiv.style = 'width: 100%; overflow-x: hidden;';
      // width: 100%; overflow-x: hidden;
      document.body.appendChild(creatdiv);

      // 监听窗口的滚动事件
      isHasNext && window.addEventListener('scroll', reduce(function () {
        var windowHeight = window.innerHeight;// 获取窗口的高度
        var documentHeight = document.body.scrollHeight;// 获取整个页面的高度
        var scrollTop = window.scrollY || document.documentElement.scrollTop; // 获取当前滚动的位置
        var distanceToBottom = documentHeight - scrollTop - windowHeight;  // 计算距离底部的距离
        if (distanceToBottom <= documentHeight * 0.4) {// 当距离底部的距离小于或等于20%时触发事件
          // 在这里添加你想触发的事件代码
          // clearLocalStorage();
          // clearCookies();
          loadMoreContent();
        }
      }, 1000 * 2));
    } else {
      adjustIframeHeight();
      setInterval(() => { adjustIframeHeight(); }, 1000 * 5); // 避免运行过快，而页面还没有加载好
      jiantingshezhiurl();
    }
  }
  // window.onload = run22;
  run22()

  // 示例函数：加载更多内容（你需要自己实现这个函数）
  function loadMoreContent() {
    // 这里是加载更多内容的逻辑
    console.log('加载更多内容...');
    let url = localStorage.getItem('iframeidhref') || '';
    url && addiframe(url);
    localStorage.removeItem('iframeidhref');
  }


  // 使用 beforeunload 事件来监听页面即将刷新或关闭的事件
  window.addEventListener('beforeunload', function (event) {
    isHasNext && window.scrollTo(0, 0);
    // 浏览器会默认显示一个确认对话框，但你可以自定义消息（虽然大部分浏览器会忽略自定义内容）
    // event.returnValue = '你确定要离开此页面吗？'; // 某些浏览器可能忽略这条消息
  });


})();